//package com.mashibing.interceptor;
//
//import org.apache.ibatis.binding.MapperMethod;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.executor.parameter.ParameterHandler;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.mapping.SqlCommandType;
//import org.apache.ibatis.plugin.Interceptor;
//import org.apache.ibatis.plugin.Intercepts;
//import org.apache.ibatis.plugin.Invocation;
//import org.apache.ibatis.plugin.Signature;
//
//import java.lang.reflect.Field;
//import java.sql.PreparedStatement;
//import java.util.Arrays;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//import java.util.Properties;
//
///**
// * MyBatis中的自定义的拦截器
// */
//@Intercepts(
//  {@Signature(
//    type = ParameterHandler.class,
//    method = "setParameters",
//    args = {PreparedStatement.class})
//  })
//public class MyInterceptor2 implements Interceptor {
//
//  private String interceptorName;
//
//  public String getInterceptorName() {
//    return interceptorName;
//  }
//
//  public void setInterceptorName(String interceptorName) {
//    this.interceptorName = interceptorName;
//  }
//
//
//  /**
//   * 执行拦截的方法
//   *
//   * @param invocation
//   * @return
//   * @throws Throwable
//   */
//  @Override
//
//  public Object intercept(Invocation invocation) throws Throwable {
//    map.put("emp", Arrays.asList("ename"));
//    ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
//    Object parameterObject = parameterHandler.getParameterObject();
//    if (Objects.isNull(parameterObject)) {
//      return invocation.proceed();
//    }
//    if (parameterObject instanceof MapperMethod.ParamMap) {
//      handleMethodInMapper(parameterHandler);
//    }
//
//    handleMethodNotInmapper(parameterHandler);
//    return invocation.proceed();
//
//  }
//  /**
//   * 对象 只处理：1.包含SensitiveData注解,属性包含EncryptField注解 2.属于com.atpingan的包或子包
//   *
//   * @param targetObj
//   */
//  private void handleMethodNotInmapper(Object targetObj) {
//    if (Objects.isNull(targetObj)) {
//      return;
//    }
//    Class<?> parameterClass = targetObj.getClass();
//    Object entity = targetObj;
//    Pair<Class<?>, Object> pair = handleQueryWrapper(targetObj);
//
//    boolean isQueryWrapperOrLambdaQueryWrapper = Objects.nonNull(pair);
//    if (isQueryWrapperOrLambdaQueryWrapper) {
//      parameterClass = pair.getLeft();
//      entity = pair.getRight();
//    }
//    if (Objects.isNull(entity)) {
//      return;
//    }
//    //是否敏感类
//    boolean sensitiveClass = SensitiveUtil.isSensitiveClass(parameterClass);
//    if (!sensitiveClass) {
//      return;
//    }
//    //路径前缀判断
//    String typeName = parameterClass.getTypeName();
//    if (!typeName.startsWith("com.atping")) {
//      return;
//    }
//    //获取敏感字段
//    List<Field> sensitiveFields = SensitiveUtil.getSensitiveField(parameterClass);
//    if (ObjectUtils.isEmpty(sensitiveFields)) {
//      return;
//    }
//    encryptField(entity, sensitiveFields);
//    if (isQueryWrapperOrLambdaQueryWrapper) {
//      ReflectUtil.setFieldValue(targetObj, "entity", entity);
//    }
//  }
//  private void encryptField(Object entity, List<Field> sensitiveFields) {
//    for (Field fs : sensitiveFields) {
//      Object fieldValue = ReflectUtil.getFieldValue(entity, fs);
//      if (fieldValue instanceof String) {
//        String fieldValueStr = (String) fieldValue;
//        ReflectUtil.setFieldValue(entity, fs, "W86z:"+AESUtil.encrypt(fieldValueStr, aesKey));
//      }
//
//    }
//  }
//
//  private void handleMethodInMapper(ParameterHandler parameterHandler) throws NoSuchFieldException, ClassNotFoundException {
//    MapperMethod.ParamMap<Object> paramMap = ( MapperMethod.ParamMap<Object>) parameterHandler.getParameterObject();
//    for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
//      String key = entry.getKey();
//      Object paramValue = entry.getValue();
//      if (!key.startsWith("param") && Objects.nonNull(paramValue)) {
//      }
//    }
//  }
//
//  private static Map<String, List<String>> map = new HashMap<>();
//  private void setFieldValue(Object obj, Field field) throws IllegalAccessException {
//    field.setAccessible(true);
//    field.set(obj, new Date());
//  }
//
//  @Override
//  public Object plugin(Object target) {
//    return Interceptor.super.plugin(target);
//  }
//
//  @Override
//  public void setProperties(Properties properties) {
//    System.out.println("setProperties : " + properties.getProperty("interceptorName"));
//    this.interceptorName = properties.getProperty("interceptorName");
//  }
//}
